package com.stox.client.ui.javafx.widget;

import java.util.List;

import javafx.scene.Node;
import javafx.scene.control.TableView;

import com.stox.client.core.model.intf.Navigable;

public class TableViewNavigableDecorator<T> implements Navigable<T> {

	private final TableView<T> tableView;
	private final Class<T> clazz;
	
	public TableViewNavigableDecorator(TableView<T> tableView, Class<T> clazz) {
		this.tableView = tableView;
		this.clazz = clazz;
	}
	
	@Override
	public Node getTarget() {
		return tableView;
	}

	@Override
	public T first() {
		return tableView.getItems().isEmpty() ? null : tableView.getItems().get(0);
	}

	@Override
	public T previous(T from) {
		int index = tableView.getItems().indexOf(from);
		if(0 == index || tableView.getItems().isEmpty()){
			return null;
		}
		if(index < 0){
			return tableView.getItems().get(tableView.getItems().size() - 1);
		}
		return tableView.getItems().get(index - 1);
	}

	@Override
	public T current() {
		return tableView.getSelectionModel().getSelectedItem();
	}

	@Override
	public List<T> currentAllSelection() {
		return tableView.getSelectionModel().getSelectedItems();
	}

	@Override
	public T next(T from) {
		int index = tableView.getItems().indexOf(from);
		if(tableView.getItems().isEmpty() || index >= tableView.getItems().size() - 1){
			return null;
		}
		if(index < 0){
			return tableView.getItems().get(0);
		}
		return tableView.getItems().get(index + 1);
	}

	@Override
	public T last() {
		return tableView.getItems().isEmpty() ? null : tableView.getItems().get(tableView.getItems().size() - 1);
	}

	@Override
	public void scrollClearAndSelect(T entity) {
		tableView.scrollTo(entity);
		tableView.getSelectionModel().clearSelection();
		tableView.getSelectionModel().select(entity);
	}

	@Override
	public Class<T> getNavigableEntityClass() {
		return clazz;
	}

}
